package com.wenzheng.quartz.common.utils;

import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.*;

import java.io.*;
import java.net.*;
import java.util.*;

/**
 * @author tdf
 * @date 2020-03-11 15:31
 **/
public class HttpUtils {

	/**
	 * 发送get请求
	 * @param url 路径及参数
	 * @return 服务器返回数据
	 * @explain 1.请求体：get传参没有请求体
	 * 2.数据格式：直接拼接到url后面，如：url?key1=value1&key2=value2&...
	 */
	public synchronized static String sendGet(String url) {
		if (url == null) {
			return null;
		}
		// 用于接收返回的结果
		String resultData = "";
		try {
			HttpClient httpClient = new HttpClient();
			httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(3000); // 设置连接超时
			httpClient.getHttpConnectionManager().getParams().setSoTimeout(180000); // 设置读取数据超时
			httpClient.getParams().setContentCharset("UTF-8");
			GetMethod get = new GetMethod(url);
			int status = httpClient.executeMethod(get);
			// 状态码为：200
			if (status == HttpStatus.SC_OK) {
				resultData = get.getResponseBodyAsString();
			}else {
				throw new RuntimeException("接口连接失败！");
			}
		}catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException("接口连接失败！");
		}
		return resultData;
	}

	/**
	 * 向指定 URL 发送POST方法的请求
	 * @param url 发送请求的 URL
	 * 请求参数，请求参数应该是 name1=value1&name2=value2 的形式。
	 * @return 所代表远程资源的响应结果
	 */
	public static String sendPost(String url, String param) {
		//    public static String sendPost(String url, Map<String, String> map) {
		//        String param = getKeyVAlueSting(map);    //如果是参数是String 就不需要再转换成name1=value1&name2=value2 的形式
		System.out.println(param);
		PrintWriter out = null;
		BufferedReader in = null;
		String result = "";
		try {
			URL realUrl = new URL(url);
			// 打开和URL之间的连接
			URLConnection conn = realUrl.openConnection();
			// 设置通用的请求属性
			conn.setRequestProperty("accept", "*/*");
			conn.setRequestProperty("connection", "Keep-Alive");
			conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
			// 发送POST请求必须设置如下两行
			conn.setDoOutput(true);
			conn.setDoInput(true);
			// 1.获取URLConnection对象对应的输出流
			out = new PrintWriter(conn.getOutputStream());
			// 2.中文有乱码的需要将PrintWriter改为如下
			// out=new OutputStreamWriter(conn.getOutputStream(),"UTF-8")
			// 发送请求参数
			out.print(param);
			// flush输出流的缓冲
			out.flush();
			// 定义BufferedReader输入流来读取URL的响应
			in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
			String line;
			while ((line = in.readLine()) != null) {
				result += line;
			}
		}catch (Exception e) {
			System.out.println("发送 POST 请求出现异常！" + e);
			e.printStackTrace();
		}
		// 使用finally块来关闭输出流、输入流
		finally {
			try {
				if (out != null) {
					out.close();
				}
				if (in != null) {
					in.close();
				}
			}catch (IOException ex) {
				ex.printStackTrace();
			}
		}
		return result;
	}

	/**
	 * 获取key=value格式字符串
	 * @param map
	 * @return
	 */
	public static String getKeyVAlueSting(Map<String, String> map) {
		String sign = "";

		Set<String> set = map.keySet();
		for (String key : set) {
			sign += key + "=" + map.get(key) + "&";
		}

		sign = sign.substring(0, sign.length() - 1);

		return sign;
	}


}
